//  1.题目：字符串“abc1abc3”，打印结果：a=2, b=2, c=2, 1=1, 3=1
//         测试用例如：输入：“aaa”, 输出： a=3
//         1、统计并打印字符串中字符出现的次数 2、给出测试用例

function strTimes(str) {
  if (typeof str !== 'string') throw new TypeError('argument should be a string type!');
  let params = {},
    result;
  for (let attr of str) {
    if (params[attr]) {
      params[attr] += 1;
    } else {
      params[attr] = 1;
    }
  }
  Object.keys(params).forEach(item => {
    result = result + `${item}=${params[item]} `;
  });
  return result;
}
// test
strTimes('abc1abc3'); // 1=1 3=1 a=2 b=2 c=2
strTimes('aaa'); // a=3

// 2.请用promise递归实现拉取100条数据,每次拉取20条，
//  结束条件为当次拉取不足20条或者已经拉取100条数据

const arr = [
  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
  28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 1, 2,
  3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
  29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
];

function getData(size, total) {
  let resultArr = [];
  function gets(start, end) {
    return new Promise((resolve, reject) => {
      let data = arr.slice(start, end); //拉取数据
      resolve(data);
    }).then(data => {
      resultArr.push(...data);
      if (data.length < size || resultArr.length >= 100) {
        return new Promise((resolve, reject) => {
          resolve(resultArr);
        });
      }
      return gets(end, end + size);
    });
  }
  return gets(0, size); //首次调用
}

getData(20, 100).then(data => {
  // console.log(data)
});

// 实现一个函数，可以将数组转化为树状数据结构
// 入参格式参考：
const list = [
  { id: 1, name: 'i1' },
  { id: 2, name: 'i2', parentId: 1 },
  { id: 4, name: 'i4', parentId: 3 },
  { id: 3, name: 'i3', parentId: 2 },
  { id: 8, name: 'i8', parentId: 7 }
];
 // 出参格式可自行设计
 function buildTree(arr) {
  let obj = {},
    newarr = [];
  arr.forEach(item => {
    obj[item.parentId] = item;
  });
  arr.forEach(item => {
    if (obj[item.id]) item.children = obj[item.id];
  });
  return arr;
}
console.log(buildTree(list));


// 4.实现一个 memorize 方法，记忆函数上次运行的结果，使得连续两次调用，如果参数相同，
//  则返回上次的执行结果，不执行函数体；如果参数不同，则执行。函数参数限1个

function memorize(fn) {
  let cache={};
  return function (args) {
    if (cache[args]) return cache[args];
    try {
     return cache[args] = fn(args);
    } catch (e) {
      throw new error(e);
    }
  };
}

// 使用示例：

const sayHello = memorize(name => {
  console.log(`hello, ${name}`);
  return `hello, ${name}`;
});

sayHello('A'); // 首次执行，打印 "hello A", 返回 "hello A"
sayHello('A'); // 第二次执行，不打印直接返回 "hello A"


